package online.shuita.gitee.mojo.utils;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ClassUtils {
    private static List<String> baseTypeList = Arrays.asList(
            "boolean",
            "int",
            "long",
            "float",
            "double",
            "void",
            "java.lang.Void",
            "java.lang.Object",
            "java.lang.String",
            "java.lang.Integer",
            "java.lang.Float",
            "java.lang.Double",
            "java.lang.Boolean",
            "java.lang.Long",
            "java.util.Date",
            "java.math.BigDecimal"
    );

    public static boolean isBaseType(String type) {
        if (baseTypeList.contains(type)) {
            return true;
        }
        return false;
    }

    /**
     * 判断指定类是否是List的子类或者父类
     *
     * @param clz 类实例
     * @return 是否
     */
    public static boolean isListTypeClass(Class clz) {
        try {
            return List.class.isAssignableFrom(clz) || clz.newInstance() instanceof List;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断指定类是否是Map的子类或者父类
     *
     * @param clz 类实例
     * @return 是否
     */
    public static boolean isMapTypeClass(Class clz) {
        try {
            return Map.class.isAssignableFrom(clz) || clz.newInstance() instanceof Map;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断指定类是否是Map的子类或者父类
     *
     * @param clz 类实例
     * @return 是否
     */
    public static boolean isSetTypeClass(Class clz) {
        try {
            return Set.class.isAssignableFrom(clz) || clz.newInstance() instanceof Set;
        } catch (Exception e) {
            return false;
        }
    }


    /**
     * 判断指定类是否是数组
     *
     * @param clz 类实例
     * @return 是否
     */
    public static boolean isArrayTypeClass(Class clz) {
        return clz.isArray();
    }


    /**
     * 判断指定类是否是数组
     *
     * @param clz 类实例
     * @return 是否
     */
    public static boolean isEnumTypeClass(Class clz) {
        return clz.isEnum();
    }
}
